#pragma once
#include <boost/asio.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <queue>
#include <mutex>
#include <memory>
#include <iostream>
using namespace std;
#define MAX_LENGTH 1024
using boost::asio::ip::tcp;
class CServer;

/**
 * @brief 消息节点类，用于存储待发送的消息数据
 */
class MsgNode
{
	friend class CSession;

public:
	MsgNode(char *msg, int max_len)
	{
		_data = new char[max_len];
		memcpy(_data, msg, max_len);
	}

	~MsgNode()
	{
		delete[] _data;
	}

private:
	int _cur_len; // 当前消息长度
	int _max_len; // 最大消息长度
	char *_data;  // 消息数据指针
};

/**
 * @brief 会话类，处理单个客户端连接的数据收发
 * @inherit enable_shared_from_this 启用共享指针支持
 */
class CSession : public std::enable_shared_from_this<CSession>
{
public:
	CSession(boost::asio::io_context &io_context, CServer *server);
	~CSession()
	{
		std::cout << "Ssession destruct" << endl;
	}
	tcp::socket &GetSocket();			  // 获取套接字对象
	std::string &GetUuid();				  // 获取会话唯一标识符
	void Start();						  // 启动会话，开始处理数据
	void Send(char *msg, int max_length); // 发送消息到客户端
private:
	// 处理异步读取完成后的回调
	void HandleRead(const boost::system::error_code &error, size_t bytes_transferred, shared_ptr<CSession> _self_shared);

	// 处理异步写入完成后的回调
	void HandleWrite(const boost::system::error_code &error, shared_ptr<CSession> _self_shared);

	tcp::socket _socket;					   // 与客户端通信的套接字
	std::string _uuid;						   // 会话唯一标识符
	char _data[MAX_LENGTH];					   // 数据缓冲区
	CServer *_server;						   // 服务器指针
	std::queue<shared_ptr<MsgNode>> _send_que; // 发送消息队列
	std::mutex _send_lock;					   // 发送队列互斥锁
};
